home *** CD-ROM | disk | FTP | other *** search
/ NOVA - For the NeXT Workstation / NOVA - For the NeXT Workstation.iso / SourceCode / AdobeExamples / NX_ImportAdv / GraphicList.m < prev    next >
Text File  |  1992-12-19  |  6KB  |  280 lines

  1.  
  2. /*
  3.  * (a)  (C) 1990 by Adobe Systems Incorporated. All rights reserved.
  4.  *
  5.  * (b)  If this Sample Code is distributed as part of the Display PostScript
  6.  *    System Software Development Kit from Adobe Systems Incorporated,
  7.  *    then this copy is designated as Development Software and its use is
  8.  *    subject to the terms of the License Agreement attached to such Kit.
  9.  *
  10.  * (c)  If this Sample Code is distributed independently, then the following
  11.  *    terms apply:
  12.  *
  13.  * (d)  This file may be freely copied and redistributed as long as:
  14.  *    1) Parts (a), (d), (e) and (f) continue to be included in the file,
  15.  *    2) If the file has been modified in any way, a notice of such
  16.  *      modification is conspicuously indicated.
  17.  *
  18.  * (e)  PostScript, Display PostScript, and Adobe are registered trademarks of
  19.  *    Adobe Systems Incorporated.
  20.  * 
  21.  * (f) THE INFORMATION BELOW IS FURNISHED AS IS, IS SUBJECT TO
  22.  *    CHANGE WITHOUT NOTICE, AND SHOULD NOT BE CONSTRUED
  23.  *    AS A COMMITMENT BY ADOBE SYSTEMS INCORPORATED.
  24.  *    ADOBE SYSTEMS INCORPORATED ASSUMES NO RESPONSIBILITY
  25.  *    OR LIABILITY FOR ANY ERRORS OR INACCURACIES, MAKES NO
  26.  *    WARRANTY OF ANY KIND (EXPRESS, IMPLIED OR STATUTORY)
  27.  *    WITH RESPECT TO THIS INFORMATION, AND EXPRESSLY
  28.  *    DISCLAIMS ANY AND ALL WARRANTIES OF MERCHANTABILITY, 
  29.  *    FITNESS FOR PARTICULAR PURPOSES AND NONINFRINGEMENT
  30.  *    OF THIRD PARTY RIGHTS.
  31.  */
  32.  
  33. /*
  34.  *    GraphicList.m
  35.  *
  36.  *    This class is used to simplify the messaging of the graphics.
  37.  *    Eliminates the need to walk the list in DrawingView.
  38.  *
  39.  *    Version:    2.0
  40.  *    Author:    Ken Fromm
  41.  */
  42.  
  43. #import "GraphicList.h"
  44. #import "GraphicImport.h"
  45. #import "DrawingView.h"
  46.  
  47. #import <appkit/nextstd.h>
  48. #import <dpsclient/wraps.h>
  49.  
  50. @implementation GraphicList
  51.  
  52. - copy
  53. {
  54.     id        copyId;
  55.  
  56.     int        i;
  57.  
  58.     copyId = [GraphicList  newCount:numElements];
  59.     for (i = 0; i < numElements; i++)
  60.         [copyId  insertObject:[self  objectAt:i]  at:i];
  61.  
  62.     return copyId;
  63. }
  64.  
  65. - copyTemp
  66. {
  67.     id        copyId;
  68.  
  69.     int        i;
  70.  
  71.     copyId = [GraphicList  newCount:numElements];
  72.     for (i = 0; i < numElements; i++)
  73.         [copyId  insertObject:[[self  objectAt:i]  copyTemp]  at:i];
  74.  
  75.     return copyId;
  76. }
  77.  
  78. - freeTemp
  79. {
  80.     int        i;
  81.  
  82.     for (i = 0; i < numElements; i++)
  83.         [[self  objectAt:i]  freeTemp];
  84.  
  85.     return self;
  86. }
  87.  
  88. - replaceObjectsIn:aList  with:bList
  89. {
  90.     int        i, j;
  91.  
  92.     j = [aList  count];
  93.     for (i = 0; i  < j; i++)
  94.     {
  95.         if (![self  replaceObject:[aList  objectAt:i]  with:[bList  objectAt:i]])
  96.             [self  insertObject:[bList  objectAt:i]  at:0];
  97.     }
  98.  
  99.     return self;
  100. }
  101.  
  102. - removeObjectsIn:bList
  103. {
  104.     int        i, j;
  105.  
  106.     j = [bList  count];
  107.     for (i = 0; i  < j; i++)
  108.         [self  removeObject:[bList  objectAt:i]];
  109.  
  110.     return self;
  111. }
  112.  
  113. - insertObjectsIn:bList
  114. {
  115.     int        i, j;
  116.  
  117.     j = [bList  count];
  118.     for (i = j-1; i  >= 0; i--)
  119.         [self  insertObject:[bList  objectAt:i]  at:0];
  120.  
  121.     return self;
  122. }
  123.  
  124. /* Set all the objects in the list to either selected or not. */
  125. - setSelected:(BOOL) flag
  126. {
  127.     int        i;
  128.     
  129.     for (i = numElements - 1; i  >= 0; i--)
  130.         [[self  objectAt:i]  setSelected:flag];
  131.     
  132.     return self;
  133. }
  134.  
  135. /* Reflect the rotation in all the objects of the list. */
  136. - rotateAboutPoint:(NXPoint *) aPoint  withAngle:(float) angle
  137. {
  138.     int        i;
  139.     
  140.     for (i = numElements - 1; i  >= 0; i--)
  141.         [[self  objectAt:i]  rotateAboutPoint:aPoint  withAngle:angle];
  142.     
  143.     return self;
  144. }
  145.  
  146. /* Reflect the change in all the objects of the list. */
  147. - moveAll:(const NXPoint *) pt
  148. {
  149.     int        i;
  150.     
  151.     for (i = numElements - 1; i  >= 0; i--)
  152.         [[self  objectAt:i]  moveAll:pt];
  153.     
  154.     return self;
  155. }
  156.  
  157. /*
  158. *    Returns the bounds.  The flag variable determines whether the
  159. *    knobs should be factored in. They may need to be for drawing but
  160. *    might not if needed for constraining reasons.
  161. */
  162. - getBounds:(NXRect *)aRect
  163. {
  164.     int        i;
  165.     
  166.     NXRect     bRect;
  167.  
  168.     for (i = numElements - 1; i  >= 0; i--)
  169.     {
  170.         [[self  objectAt:i] getBounds:&bRect];
  171.         if (i == numElements - 1)
  172.             *aRect = bRect;
  173.         else
  174.             NXUnionRect(&bRect, aRect);
  175.     }
  176.  
  177.     return self;
  178. }
  179.  
  180. /*
  181. *    Return the rectangle that should be used for scrolling purposes.
  182. *    When the rectangle passes out of the visible rectangle then
  183. *    the screen should scroll.
  184. */
  185. - getScrollRect:(NXRect *)aRect  forPtNum:(int) pt_num
  186. {
  187.     return [self  getBounds:aRect];
  188. }
  189.  
  190. - constrainAngle:(float *) angle  withFlags:(int)flags
  191. {
  192.     [[self  objectAt:0]  constrainAngle:angle  withFlags:flags];
  193.  
  194.     return self;
  195. }
  196.  
  197. /*
  198. *    Check for a control point hit on all the objects in the list. If yes then return
  199. *    the hit object.
  200. */
  201. - hitControl:(const NXRect *) hitRect  :(int *) pt_num  forSize:(float) size
  202. {
  203.     id        objectId;
  204.  
  205.     int        i;
  206.     
  207.     for (i = 0; i < numElements; i++)
  208.         if (objectId = [[self  objectAt:i]  hitControl:hitRect :pt_num  forSize:(float) size])
  209.             return objectId;
  210.  
  211.     return nil;
  212. }
  213.  
  214. /*
  215. *    Place the point locations and the chararacters for the control
  216. *    points of the objects in the list into the user path description.
  217. */
  218. - putControlPoints:(UPath *)buffer  forRect:(NXRect *)r  :(NXPoint *) lastPoint
  219. {
  220.     int    i;
  221.     
  222.     for (i = numElements - 1; i  >= 0; i--)
  223.         [[self  objectAt:i]  putControlPoints:buffer  forRect:r  :lastPoint];
  224.  
  225.     return self;
  226. }
  227.  
  228. /*
  229.  *    Draws the graphic.
  230.  */
  231. - drawObject:(NXRect *) r  withFlags:(int) flags  inView:view
  232. {
  233.     id        graphic;
  234.  
  235.     int        i;
  236.  
  237.     for (i = numElements - 1; i  >= 0; i--)
  238.     {
  239.         graphic = [self  objectAt:i];
  240.         [graphic  drawObject:r  withFlags:flags  inView:view];
  241.  
  242.         if (NXDrawingStatus == NX_DRAWING &&
  243.             flags & REFRESHFLAG &&
  244.                 [graphic  isKindOf:[GraphicImport class]])
  245.         {
  246.             /*
  247.             *  Relies on the assumption that the buffer is the currently
  248.             *  focused view. This refreshes the screen with each EPSF file.
  249.             *  If not then it could take a while to have some visual results
  250.             *  when imaging several files in a row.
  251.             */
  252.             [[view  buffer]  unlockFocus];
  253.              PScomposite(NX_X(r), NX_Y(r), NX_WIDTH(r), NX_HEIGHT(r),
  254.                         [[view  buffer]  gState], r->origin.x, r->origin.y, NX_COPY);
  255.             [[view  buffer]  lockFocus];
  256.         }
  257.     }
  258.  
  259.     return self;
  260. }
  261.  
  262. - addResources:(Resource *) resourceDoc  for:(NXRect *) r
  263. {
  264.     id        graphic;
  265.  
  266.     int        i;
  267.  
  268.     for (i = numElements - 1; i  >= 0; i--)
  269.     {
  270.         graphic = [self  objectAt:i];
  271.         if ([graphic  isKindOf:[GraphicImport class]])
  272.             [graphic  addResources:resourceDoc  for:r];
  273.     }
  274.  
  275.     return self;
  276. }
  277.  
  278. @end
  279.  
  280.